/*
 * =====================================================================================
 *
 *       Filename:  Trie.hpp
 *
 *    Description:
 *
 *        Version:  1.0
 *        Created:  2017年07月12日 16时21分57秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Crane ()
 *   Organization:  free-src
 *
 * =====================================================================================
 */



#ifndef  Trie_H_
#define  Trie_H_

#include <map>
#include <string>

const int   Trie_SUCCESS  =  0;
const int   Trie_FAILED   = -1;
const int   Trie_EXISTED  = -101;

class  TrieNode
{
    typedef std::string string;

    // 如果一个节点不是词结尾, 就存这个玩意
    static const char  NullContent  = '#';

    // 如果一个节点是Trie树根节点, 就在这里
    static const char  RootContent  = '*';

public:
    TrieNode(char content = NullContent) :
        value_(content),
        parent_(nullptr)
    {

    }

    bool isDicEnd() const {
        return  value_ != NullContent;
    }

    bool hasChildren() const {
        return childrens_.size() > 0;
    }

    void setContent(char content) {
        value_ = content;
    }

    int  insertChild(string  content) {
        // 两种方案:
        // option 1: 单个字符递归插入insertChar(char),
        //           返回子节点insertChar(char) 返回值.( 层层递归 )
        //
        // option 2: 先查询串是否存在 exist( string );
        //           如果不存在: 查找最大重复子串 findCommon(string)
        //           从子串后开始插入 insertString( string ) # 明确就是要插入
        //
        // 目前选择 option 1 ( 模型简单 )

        return Trie_SUCCESS;
    }

private:
    char  value_;
    std::map<char, TrieNode *>  childrens_;

    TrieNode *  parent_;
};

#endif   /* ----- #ifndef Trie_H_  ----- */
